/**
 * @Author: XJH
 * @Description: TODO
 * @Date: 2025/10/21 21:26
 * @Version: 1.0
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: XJH
 * @Description: TODO
 * @Date: 2025/10/21 21:26
 * @Version: 1.0
 * 49. 字母异位词分组
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
 * 解释：
eat、tea、ate → 标签都是 a1e1t1（a 出现 1 次，e 出现 1 次，t 出现 1 次）；
tan、nat → 标签都是 a1n1t1；
bat → 标签是 a1b1t1。
 *
 */
public class Alphabetic_Anagrams_Grouping {
    public List<List<String>> groupAnagrams(String[] strs) {
        return new ArrayList<>(Arrays.stream(strs)
                .collect(Collectors.groupingBy(str -> {
                    int[] counter = new int[26];//26个字母的计数器
                    for (int i = 0; i < str.length(); i++) {
                        counter[str.charAt(i) - 'a']++;
                    }
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 26; i++) {
                        // 这里的 if 是可省略的，但是加上 if 以后，生成的 sb 更短，后续 groupingBy 会更快。
                        if (counter[i] != 0) {
                            sb.append((char) ('a' + i));
                            sb.append(counter[i]);
                        }
                    }
                    return sb.toString();
                })).values());
    }
}
